/**
 * 带头结点的链式栈:
 * 		1. 在实现数据"入栈"操作时，需要将数据从链表的头部插入；
 * 		2. 在实现数据"出栈"操作时，需要将数据从链表的头部插入；
 * 链式就是一个头插法头删除的链表
 */
#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
	int data;
	struct LNode* next;
}LNode,LinkedStack;

/**
 * @brief 入栈
 * 
 * @return LinkedStack
 */
LinkedStack* push(LinkedStack* stack, int data);

/**
 * @brief 出栈
 * 
 * @return LinkedStack
 */
LinkedStack* pop(LinkedStack* stack);

/**
 * @brief 栈内元素展示
 */
void display(LinkedStack* stack);

int main()
{
	LinkedStack * stack=NULL;
	stack=push(stack, 1);
	stack=push(stack, 2);
	stack=push(stack, 3);
	stack=push(stack, 4);
	stack=pop(stack);
	stack=pop(stack);
	stack=pop(stack);
	stack=pop(stack);
	stack=pop(stack);
	display(stack);

	
	return 0;
}

LinkedStack* push(LinkedStack* stack, int data)
{
	LNode* head=stack;
	LNode* node=(LNode* )malloc(sizeof(LNode));
	if(!node) return stack;
	node->data=data;
	
//	if(stack==NULL)
//	{
//		stack=node;
//		return stack;
//	}
//	
	node->next=stack;	//入栈结点的next域指向链表首部
	stack=node;			//重新定位链表的首部
	return stack;
}

LinkedStack* pop(LinkedStack* stack)
{
	if(!stack)
	{
		printf("栈内没有元素\n");
		return stack;
	}
	
	if(stack)
	{
		LNode* delete_node=stack;
		stack=stack->next;
		printf("元素%d出栈\n",delete_node->data);
		free(delete_node);
		return stack;
	}
}

void display(LinkedStack* stack)
{
	LNode* head=stack;
	while(head)
	{
		printf("%d ",head->data);
		head=head->next;
	}
	printf("\n");
}